package com.dragoncombin.homework.Module03.Problem04;

import java.util.List;
import java.util.Scanner;

public class StudentInfoManageSystem {

    // 该类是学生管理系统的工具类，提供各种对学生信息的管理操作
    // 管理操作包括增加、删除、修改和查找以及遍历学生信息
    private static Scanner in = new Scanner(System.in);
    private List<Student> students;

    public StudentInfoManageSystem(List<Student> students) {
        setStudents(students);
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    // 0. 打印功能列表
    public static void printFuncList() {
        System.out.println("0 -- 退出");
        System.out.println("1 -- 增加学生信息");
        System.out.println("2 -- 删除学生信息");
        System.out.println("3 -- 修改学生信息");
        System.out.println("4 -- 查找学生信息");
        System.out.println("5 -- 查看所有学生信息");
        System.out.println("6 -- 查看功能列表");
    }

    // 1. 开始界面打印提示信息
    public static void start() {
        System.out.println("=========学生信息管理系统=========");
        System.out.println("欢迎进入学生信息管理系统！");
        System.out.println("按照下列提示输入序号进入相应的功能界面： ");
        printFuncList();
    }

    // 2. 定义增加学生信息的方法
    public void addStudent() {
        System.out.print("请输入学生学号: ");
        int id = in.nextInt();
        System.out.print("请输入学生姓名: ");
        String name = in.next();
        System.out.print("请输入学生年龄: ");
        int age = in.nextInt();
        // 根据用户输入创建Student对象
        Student student = new Student(id, name, age);
        students.add(student);
        System.out.println("添加成功，学生信息： " + student);
    }

    // 3. 定义打印所有学生信息的方法 - -
    public void printAllStudent() {
        for (Student s : students) {
            System.out.println("学生信息: " + "学号-" + s.getId() + ", 姓名-" + s.getName() + ", 年龄-" + s.getAge());
        }
    }

    // 4. 定义获取用户输入的方法
    public static int getInput() {
        System.out.println("\n请输入功能编号: ");
        int input = in.nextInt();
        // 判断输入是否合法
        if (input >= 0 && input <= 6) return input;
        System.out.println("输入值不合法，请输入0-5之间的数字");
        return -1;
    }

    // 5. 根据用户输入的序号显示不同的模式
    public void enterMode(int n) {
        switch (n) {
            case 1:
                System.out.println("=======添加模式=======");
                addStudent();
                break;
            case 2:
                System.out.println("=======删除模式=======");
                deleteStudent();
                break;
            case 3:
                System.out.println("=======修改模式=======");
                setStudent();
                break;
            case 4:
                System.out.println("=======查找模式=======");
                findStudent();
                break;
            case 5:
                System.out.println("=======查看所有学生信息=======");
                printAllStudent();
                break;
            case 6:
                printFuncList();
        }
    }

    // 6. 定义查找学生信息的方法: 提示用户输入学生的学号，打印搜索得到的信息
    public int findStudent(String msg) {
        System.out.println("请输入" + msg + "学生学号: ");
        int id = in.nextInt();
        // 根据用户输入的学号，创建Student对象
        Student std = new Student();
        std.setId(id);
        // 查找List集合中该元素的索引位置，若不存在则返回-1
        int res = students.indexOf(std);
        if (-1 == res) {
            System.out.println("该学生不存在，请确认学号后重新输入");
            return -1;
        }
        System.out.println(msg + "学生信息: " + students.get(res));
        return res;
    }

    // findStudent方法重载 无参方法
    public int findStudent() {
        System.out.println("请输入学生学号: ");
        int id = in.nextInt();
        // 根据用户输入的学号，创建Student对象
        Student std = new Student();
        std.setId(id);
        // 查找List集合中该元素的索引位置，若不存在则返回-1
        int res = students.indexOf(std);
        if (-1 == res) {
            System.out.println("该学生不存在，请确认学号后重新输入");
            return -1;
        }
        System.out.println("学生信息: " + students.get(res));
        return res;
    }

    // 7. 删除学生信息： 首先提示用户输入学生的学号，根据学生的学号获取该学生的信息
    // 提示用户是否真的删除，得到用户yes的反馈后删除该学生
    public void deleteStudent() {
        // 调用findStudent方法，提示用户输入，并查找学生信息
        int index = findStudent("待删除");
        if (-1 != index) {
            System.out.println("确定删除该学生信息吗？(yes/no)");
            String str = in.next();
            if ("yes".equals(str) || "Y".equals(str)) {
                students.remove(index);
                System.out.println("成功删除该学生信息");
            }
        }
    }

    // 8. 修改学生信息，提示用户输入学生学号，找到学生信息后提示用户输入学生姓名和年龄
    public void setStudent() {
        // 调用findStudent方法，提示用户输入，并查找学生信息
        int index = findStudent("待修改");
        if (-1 != index) {
            // 提示用户输入学生的姓名和年龄
            System.out.print("请输入学生姓名: ");
            String name = in.next();
            System.out.print("请输入学生年龄: ");
            int age = in.nextInt();
            // 获得待修改的学生对象的引用
            Student student = students.get(index);
            student.setName(name);
            student.setAge(age);
            // 打印修改后的学生信息
            System.out.println("修改成功");
            System.out.println("修改后该学生的信息： " + student);
        }
    }
}
